package javaSenior.threadExer;

import javax.print.attribute.standard.RequestingUserName;

/**
 * @author Lenl
 * @version v1.0
 * @create 2021-06-03 0:39
 * @description 线程间通信的测试
 *
 * wait()//阻塞并释放同步监视器
 * notify()//唤醒一个优先级更高的wait的线程
 * notifyAll()//唤醒所有wait的线程
 * 说明：1。这三个方法必须使用在同步代码块或同步方法中
 *      2.三个方法的调用者必须是同步监视器
 *      3.这三个方法是定义在Object中的
 *
 * 面试题：sleep方法与wait方法的异同
 *      同：一旦使用都会使当前线程阻塞
 *      异：1.声明位置不同：Thread类中声明sleep()，Object类中声明wait()
 *         2.调用要求不同：sleep可在任何场景，wait必须声明在同步代码块或同步方法中
 *         3.关于是否释放同步监视器：sleep()不释放锁，wait()释放锁
 *
 */
public class ThreadCommunication {
    public static void main(String[] args) {
        Number n1=new Number();
        Thread t1=new Thread(n1);
        Thread t2=new Thread(n1);
        t1.setName("线程1");
        t2.setName("线程2");
        t1.start();
        t2.start();
    }
}

class Number implements Runnable{
    private int number=1;

    @Override
    public void run() {
        while(true){
            synchronized (this) {
                notify();//唤醒一个阻塞的线程
                if(number<=100){
                    System.out.println(Thread.currentThread().getName()+"打印了："+number++);
                    try {
                        wait();//使得调用wait方法的线程进行阻塞，wait阻塞会释放锁

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }else break;
            }
        }
    }
}